5 kyu
參數 bonus 為獎金,price 是一罐啤酒的價格。
用啤酒搭金字塔,最上層 1 罐、第二層 4 罐、第三層 9 罐,依此類推。
計算所能買到的啤酒可以搭的金字塔層數。
啤酒金字塔是序列數字的平方;
也就是 1^2+2^2+3^2+4^2 ….總和加起來,要小於等於能買的啤酒數量。
因此只要在限制之內,跑不確定迴圈次數 while,最後累計出的即是金字塔的層數。
start = 0
while loop
bonus - Math.pow(start,2) * price
return start
var beeramid = function (bonus, price) {
if (price > bonus) return 0;
let start = 0;
while (bonus >= Math.pow(start + 1, 2) * price) {
start++;
bonus = bonus - Math.pow(start, 2) * price;
}
return start;
}
while 迴圈 ()
帶入的,是讓迴圈繼續進行的條件;同時也是停止條件。
因此 bonus 還能扣除該階層所需的啤酒就進入循環;否則當 bonus 不夠扣除時則跳出。
從 0 開始,先 start ++ 之後,再扣除每階層所需數量。
是為了讓 start 保留的是正確結果,確保每一次的循環,bonus 已經拿去買了啤酒,並且拼湊出金字塔的一層。
其實一開始構想是用 + 的方式去累計金額,比對不超過 bonus 時,反而一直出各種問題。
突然轉彎想說那乾脆用扣除的呢?扣除反而簡單很多,最佳解也是類似概念。
不過我很常出現一開始的構思跟虛擬碼,和實作天差地遠的狀況。
思考方式還在建立中的感覺~